package disk_rpc

import (
	"context"
	"disk/disk_rpc_server/disk_pb"
	"disk/utils/mysql"
	"github.com/gin-gonic/gin"
	"net/url"
	"strconv"
)

func Query(r *gin.RouterGroup) {
	r.GET("/list/:name", func(c *gin.Context) {
		name := c.Param("name")
		var dataList []mysql.DiskList
		result, err := NewClient().Query(context.Background(), &disk_pb.QueryReq{
			Name: name,
		})
		if err != nil {
			c.JSON(200, gin.H{
				"msg":  "查询失败",
				"data": err.Error(),
				"code": 400,
			})
			return
		}

		if result.Code != 0 {
			c.JSON(200, gin.H{
				"msg":  "查询失败",
				"data": result.Message,
				"code": 400,
			})
			return
		}

		if len(result.List) == 0 {
			c.JSON(200, gin.H{
				"msg":  "查询失败，数据不存在",
				"data": dataList,
				"code": 400,
			})
		} else {
			c.JSON(200, gin.H{
				"msg":  "查询成功",
				"data": dataList,
				"code": 200,
			})
		}
	})
}

func QueryPage(r *gin.RouterGroup) {
	r.GET("/list/", func(c *gin.Context) {
		var dataList []mysql.DiskList

		var pageSize, pageNum int
		pageSizeStr := c.Query("pageSize")
		pageNumStr := c.Query("pageNum")
		if pageSizeStr != "" {
			pageSizeInt, err := strconv.Atoi(pageSizeStr)
			if err != nil {
				c.JSON(200, gin.H{
					"msg":  "查询失败，pageSize参数格式错误",
					"data": err.Error(),
					"code": 400,
				})
				return
			}
			pageSize = pageSizeInt
		} else {
			pageSize = -1
		}

		if pageNumStr != "" {
			pageNumInt, err := strconv.Atoi(pageNumStr)
			if err != nil {
				c.JSON(200, gin.H{
					"msg":  "查询失败，pageNum参数格式错误",
					"data": err.Error(),
					"code": 400,
				})
				return
			}
			pageNum = pageNumInt
		} else {
			pageNum = 1
		}

		result, err := NewClient().QueryPage(context.Background(), &disk_pb.QueryPageReq{
			PageNum:     int32(pageNum),
			PageSize:    int32(pageSize),
			QueryParams: valuesToStringMap(c.Request.URL.Query()),
		})
		if err != nil {
			c.JSON(200, gin.H{
				"msg":  "查询失败",
				"data": err.Error(),
				"code": 400,
			})
			return
		}
		if result.Code != 0 {
			c.JSON(200, gin.H{
				"msg":  "查询失败",
				"data": result.Message,
				"code": 400,
			})
			return
		}

		mysql.DiskListRpcToOrm(result.List, &dataList)
		if len(dataList) == 0 {
			c.JSON(200, gin.H{
				"msg":  "查询失败，数据不存在",
				"data": dataList,
				"code": 400,
			})
		} else {
			c.JSON(200, gin.H{
				"msg": "查询成功",
				"data": gin.H{
					"list":     dataList,
					"total":    result.Total,
					"pageNum":  pageNum,
					"pageSize": pageSize,
				},
				"code": 200,
			})
		}
	})
}

func valuesToStringMap(values url.Values) map[string]string {
	stringMap := make(map[string]string)
	for k, v := range values {
		if k != "pageSize" && k != "pageNum" {
			if len(v) > 0 {
				stringMap[k] = v[0]
			}
		}
	}
	return stringMap
}
